#include <iostream>
#include <map>
#include <utility>
#include <string>
using std::cout;
using std::endl;
using std::map;
using std::pair;
using std::string;
using std::make_pair;

void test(){
    //希望存储多个学生的信息，学生的信息包含id和姓名
    //如果key相同，会怎么样
    //如果value相同，会怎么样
    //map构造的方式，其实就是构造pair的方式
    //因为map里面存储的就是一个一个的pair
    map<int,string> stus = {
        //构造一个一个的pair
        {1, "张三"},
        pair<int,string>(2, "李四"),
        make_pair<int,string>(3, "王五"),
        make_pair<int,string>(3, "赵六"),
        pair<int,string>(4, "王五")
    };
    //如何迭代map
    //增强for循环
    for(auto & ele : stus){
        cout << ele.first << ":" << ele.second << endl;
    }
    //使用迭代器的方式 指向的便是当前位置的pair数据
    auto it = stus.begin();
    while(it != stus.end()){
        cout << (*it).first << ":" << (*it).second << endl;
        cout << it->first << ":" << it->second << endl;

        ++it;
    }
}

void test2(){
    map<int,string> stus = {
        //构造一个一个的pair
        {1, "张三"},
        pair<int,string>(2, "李四"),
        make_pair<int,string>(3, "王五"),
        make_pair<int,string>(3, "赵六"),
        pair<int,string>(4, "王五")
    };
    //如果查找到则返回1，如果没有查找到则返回0
    cout << stus.count(1) << endl;
    cout << stus.count(5) << endl;

    //find函数
    //it迭代器指向的是pair整体
    //auto it = stus.find(1);
    auto it = stus.find(5);
    if(it != stus.end()){
        cout << "查找到元素" << it->first << "=" << it->second << endl;
    }else {
        cout << "没有查找到元素" << endl;
    }
}

void test3(){
    map<int,string> stus = {
        //构造一个一个的pair
        {1, "张三"},
        pair<int,string>(2, "李四"),
        make_pair<int,string>(3, "王五"),
        make_pair<int,string>(3, "赵六"),
        pair<int,string>(4, "王五")
    };
    //插入单个键值对
    //返回值返回的是一个pair<iterator,bool>
    //iterator指向了特定位置的数据map里面的数据其实就是pair(pair)
    //bool表示当前插入操作是否成功
    auto result = stus.insert({5, "赵六"});
    if(result.second){
        cout << "插入成功" << 
            result.first->first << "=" << result.first->second << endl;
    }else {
        cout << "插入失败" << endl;
    }
}

void test4(){
    map<int,string> stus = {
        //构造一个一个的pair
        {1, "张三"},
        pair<int,string>(2, "李四"),
        make_pair<int,string>(3, "王五"),
        make_pair<int,string>(3, "赵六"),
        pair<int,string>(4, "王五")
    };
    //批量插入
    stus.insert({
                {5, "zhangsan"},
                {6, "lisi"}
                });

    //迭代遍历
    for(auto & ele : stus){
        cout << ele.first << "=" << ele.second << endl;
    }
}

void test5(){
    map<int,string> stus = {
        //构造一个一个的pair
        {1, "张三"},
        pair<int,string>(2, "李四"),
        make_pair<int,string>(3, "王五"),
        make_pair<int,string>(3, "赵六"),
        pair<int,string>(4, "王五")
    };
    cout << stus[1] << endl;
    //当执行下标访问的时候，那么无论存不存在，执行过后
    //该下标对应的键值对都会被插入到map中
    //如果之前key已经存在，那么不会做任何的操作
    //如果之前的key不存在，则会插入当前value值默认0值数据
    cout << stus[9] << endl;
    for(auto & ele : stus){
        cout << ele.first << ":" << ele.second << endl;
    }
    //更新操作
    stus[1] = "张三三";
    //直接执行插入操作
    stus[10] = "小王";
    for(auto & ele: stus){
        cout << ele.first << ":" << ele.second << endl;
    }
}

int main()
{
    test5();
    return 0;
}

